# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py

# RUN: llc -mtriple aarch64 -run-pass=aarch64-prelegalizer-combiner --aarch64prelegalizercombinerhelper-only-enable-rule="and_or_disjoint_mask" -global-isel -verify-machineinstrs %s -o - | FileCheck %s
# REQUIRES: asserts

...
---
name:            disjoint_masks
tracksRegLiveness: true
machineFunctionInfo: {}
body:             |
  bb.0:
    liveins: $w0
    ; CHECK-LABEL: name: disjoint_masks
    ; CHECK: liveins: $w0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: %x:_(s32) = COPY $w0
    ; CHECK-NEXT: %two:_(s32) = G_CONSTANT i32 2
    ; CHECK-NEXT: %and:_(s32) = G_AND %x, %two
    ; CHECK-NEXT: $w0 = COPY %and(s32)
    ; CHECK-NEXT: RET_ReallyLR implicit $w0
    %x:_(s32) = COPY $w0
    %one:_(s32) = G_CONSTANT i32 1
    %two:_(s32) = G_CONSTANT i32 2
    %or:_(s32) = G_OR %x, %one
    %and:_(s32) = G_AND %or, %two
    $w0 = COPY %and(s32)
    RET_ReallyLR implicit $w0
...
---
name:            disjoint_masks_rev
tracksRegLiveness: true
machineFunctionInfo: {}
body:             |
  bb.0:
    liveins: $w0
    ; CHECK-LABEL: name: disjoint_masks_rev
    ; CHECK: liveins: $w0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: %x:_(s32) = COPY $w0
    ; CHECK-NEXT: %two:_(s32) = G_CONSTANT i32 2
    ; CHECK-NEXT: %and:_(s32) = G_AND %x, %two
    ; CHECK-NEXT: $w0 = COPY %and(s32)
    ; CHECK-NEXT: RET_ReallyLR implicit $w0
    %x:_(s32) = COPY $w0
    %one:_(s32) = G_CONSTANT i32 1
    %two:_(s32) = G_CONSTANT i32 2
    %or:_(s32) = G_OR %x, %one
    %and:_(s32) = G_AND %two, %or
    $w0 = COPY %and(s32)
    RET_ReallyLR implicit $w0
...
---
name:            intersecting_masks
tracksRegLiveness: true
machineFunctionInfo: {}
body:             |
  bb.0:
    liveins: $w0
    ; CHECK-LABEL: name: intersecting_masks
    ; CHECK: liveins: $w0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: %x:_(s32) = COPY $w0
    ; CHECK-NEXT: %one:_(s32) = G_CONSTANT i32 3
    ; CHECK-NEXT: %two:_(s32) = G_CONSTANT i32 2
    ; CHECK-NEXT: %or:_(s32) = G_OR %x, %one
    ; CHECK-NEXT: %and:_(s32) = G_AND %or, %two
    ; CHECK-NEXT: $w0 = COPY %and(s32)
    ; CHECK-NEXT: RET_ReallyLR implicit $w0
    %x:_(s32) = COPY $w0
    %one:_(s32) = G_CONSTANT i32 3
    %two:_(s32) = G_CONSTANT i32 2
    %or:_(s32) = G_OR %x, %one
    %and:_(s32) = G_AND %or, %two
    $w0 = COPY %and(s32)
    RET_ReallyLR implicit $w0
...
---
name:            intersecting_masks_rev
tracksRegLiveness: true
machineFunctionInfo: {}
body:             |
  bb.0:
    liveins: $w0
    ; CHECK-LABEL: name: intersecting_masks_rev
    ; CHECK: liveins: $w0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: %x:_(s32) = COPY $w0
    ; CHECK-NEXT: %one:_(s32) = G_CONSTANT i32 3
    ; CHECK-NEXT: %two:_(s32) = G_CONSTANT i32 2
    ; CHECK-NEXT: %or:_(s32) = G_OR %x, %one
    ; CHECK-NEXT: %and:_(s32) = G_AND %two, %or
    ; CHECK-NEXT: $w0 = COPY %and(s32)
    ; CHECK-NEXT: RET_ReallyLR implicit $w0
    %x:_(s32) = COPY $w0
    %one:_(s32) = G_CONSTANT i32 3
    %two:_(s32) = G_CONSTANT i32 2
    %or:_(s32) = G_OR %x, %one
    %and:_(s32) = G_AND %two, %or
    $w0 = COPY %and(s32)
    RET_ReallyLR implicit $w0
...
---
name:            disjoint_masks_v
tracksRegLiveness: true
machineFunctionInfo: {}
body:             |
  bb.0:
    liveins: $x0
    ; CHECK-LABEL: name: disjoint_masks_v
    ; CHECK: liveins: $x0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: %x:_(<2 x s32>) = COPY $x0
    ; CHECK-NEXT: %one:_(s32) = G_CONSTANT i32 1
    ; CHECK-NEXT: %one_v:_(<2 x s32>) = G_DUP %one(s32)
    ; CHECK-NEXT: %two:_(s32) = G_CONSTANT i32 2
    ; CHECK-NEXT: %two_v:_(<2 x s32>) = G_DUP %two(s32)
    ; CHECK-NEXT: %or:_(<2 x s32>) = G_OR %x, %one_v
    ; CHECK-NEXT: %and:_(<2 x s32>) = G_AND %or, %two_v
    ; CHECK-NEXT: $x0 = COPY %and(<2 x s32>)
    ; CHECK-NEXT: RET_ReallyLR implicit $x0
    %x:_(<2 x s32>) = COPY $x0
    %one:_(s32) = G_CONSTANT i32 1
    %one_v:_(<2 x s32>) = G_DUP %one
    %two:_(s32) = G_CONSTANT i32 2
    %two_v:_(<2 x s32>) = G_DUP %two
    %or:_(<2 x s32>) = G_OR %x, %one_v
    %and:_(<2 x s32>) = G_AND %or, %two_v
    $x0 = COPY %and(<2 x s32>)
    RET_ReallyLR implicit $x0
...
